home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 August: Tool Chest / Dev.CD Aug 94.toast / Sample Code / MoreFiles 1.1.1 / MoreFiles.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-22  |  16.4 KB  |  601 lines  |  [TEXT/KAHL]

  1. /*
  2. **    Apple Macintosh Developer Technical Support
  3. **
  4. **    The long lost high-level and FSSpec File Manager functions.
  5. **
  6. **    by Jim Luther, Apple Developer Technical Support
  7. **
  8. **    File:        MoreFiles.c
  9. **
  10. **    Copyright © 1992-1994 Apple Computer, Inc.
  11. **    All rights reserved.
  12. **
  13. **    You may incorporate this sample code into your applications without
  14. **    restriction, though the sample code has been provided "AS IS" and the
  15. **    responsibility for its operation is 100% yours.  However, what you are
  16. **    not permitted to do is to redistribute the source as "DSC Sample Code"
  17. **    after having made changes. If you're going to re-distribute the source,
  18. **    we require that you make it clear in the source that the code was
  19. **    descended from Apple Sample Code, but that you've made changes.
  20. */
  21.  
  22.  
  23. #ifndef __MOREFILES__
  24. #include "MoreFiles.h"
  25. #endif
  26.  
  27.  
  28. /*****************************************************************************/
  29.  
  30. /* static prototypes */
  31.  
  32. static    void    pcpy(StringPtr d,
  33.                      StringPtr s);
  34.  
  35. /*****************************************************************************/
  36.  
  37. /* Copy a Pascal-string. */
  38. static    void    pcpy(StringPtr d,
  39.                      StringPtr s)
  40. {
  41.     short    i;
  42.  
  43.     i = *s;
  44.     do {
  45.         d[i] = s[i];
  46.     } while (i--);
  47. }
  48.  
  49. /*****************************************************************************/
  50.  
  51. pascal    OSErr    HGetVolParms(StringPtr volName,
  52.                              short vRefNum,
  53.                              GetVolParmsInfoBuffer *volParmsInfo,
  54.                              long *infoSize)
  55. {
  56.     HParamBlockRec pb;
  57.     OSErr error;
  58.  
  59.     pb.ioParam.ioNamePtr = volName;
  60.     pb.ioParam.ioVRefNum = vRefNum;
  61.     pb.ioParam.ioBuffer = (Ptr)volParmsInfo;
  62.     pb.ioParam.ioReqCount = *infoSize;
  63.     error = PBHGetVolParmsSync(&pb);
  64.     *infoSize = pb.ioParam.ioActCount;
  65.     return (error);
  66. }
  67.  
  68. /*****************************************************************************/
  69.  
  70. pascal    OSErr    HCreateMinimum(short vRefNum,
  71.                                long dirID,
  72.                                const Str255 fileName)
  73. {
  74.     HParamBlockRec pb;
  75.  
  76.     pb.fileParam.ioNamePtr = (StringPtr)fileName;
  77.     pb.fileParam.ioVRefNum = vRefNum;
  78.     pb.ioParam.ioVersNum = 0;
  79.     pb.fileParam.ioDirID = dirID;
  80.     return (PBHCreateSync(&pb));
  81. }
  82.  
  83. /*****************************************************************************/
  84.  
  85. pascal    OSErr    FSpCreateMinimum(const FSSpec *spec)
  86. {
  87.     return (HCreateMinimum(spec->vRefNum, spec->parID, spec->name));
  88. }
  89.  
  90. /*****************************************************************************/
  91.  
  92. pascal    OSErr    ExchangeFiles(short vRefNum,
  93.                               long srcDirID,
  94.                               const Str255 srcName,
  95.                               long dstDirID,
  96.                               const Str255 dstName)
  97. {
  98.     HParamBlockRec pb;
  99.  
  100.     pb.fidParam.ioVRefNum = vRefNum;
  101.     pb.fidParam.ioSrcDirID = srcDirID;
  102.     pb.fidParam.ioNamePtr = (StringPtr)srcName;
  103.     pb.fidParam.ioDestDirID = dstDirID;
  104.     pb.fidParam.ioDestNamePtr = (StringPtr)dstName;
  105.     return (PBExchangeFilesSync(&pb));
  106. }
  107.  
  108. /*****************************************************************************/
  109.  
  110. pascal    OSErr    ResolveFileIDRef(StringPtr volName,
  111.                                  short vRefNum,
  112.                                  long fileID,
  113.                                  long *parID,
  114.                                  StringPtr fileName)
  115. {
  116.     HParamBlockRec pb;
  117.     OSErr error;
  118.     Str255 tempStr = "\p";
  119.  
  120.     if (volName != nil)
  121.         pcpy(tempStr, volName);
  122.     pb.fidParam.ioNamePtr = (StringPtr)tempStr;
  123.     pb.fidParam.ioVRefNum = vRefNum;
  124.     pb.fidParam.ioFileID = fileID;
  125.     error = PBResolveFileIDRefSync(&pb);
  126.     *parID = pb.fidParam.ioSrcDirID;
  127.     if (fileName != nil)
  128.         pcpy(fileName, tempStr);
  129.     return (error);
  130. }
  131.  
  132. /*****************************************************************************/
  133.  
  134. pascal    OSErr    CreateFileIDRef(short vRefNum,
  135.                                 long parID,
  136.                                 const Str255 fileName,
  137.                                 long *fileID)
  138. {
  139.     HParamBlockRec pb;
  140.     OSErr error;
  141.  
  142.     pb.fidParam.ioNamePtr = (StringPtr)fileName;
  143.     pb.fidParam.ioVRefNum = vRefNum;
  144.     pb.fidParam.ioSrcDirID = parID;
  145.     error = PBCreateFileIDRefSync(&pb);
  146.     *fileID = pb.fidParam.ioFileID;
  147.     return (error);
  148. }
  149.  
  150. /*****************************************************************************/
  151.  
  152. pascal    OSErr    FSpCreateFileIDRef(const FSSpec *spec,
  153.                                    long *fileID)
  154. {
  155.     return (CreateFileIDRef(spec->vRefNum, spec->parID, spec->name, fileID));
  156. }
  157.  
  158. /*****************************************************************************/
  159.  
  160. pascal    OSErr    DeleteFileIDRef(StringPtr volName,
  161.                                 short vRefNum,
  162.                                 long fileID)
  163. {
  164.     HParamBlockRec pb;
  165.  
  166.     pb.fidParam.ioNamePtr = volName;
  167.     pb.fidParam.ioVRefNum = vRefNum;
  168.     pb.fidParam.ioFileID = fileID;
  169.     return (PBDeleteFileIDRefSync(&pb));
  170. }
  171.  
  172. /*****************************************************************************/
  173.  
  174. pascal    OSErr    FlushFile(short refNum)
  175. {
  176.     ParamBlockRec pb;
  177.  
  178.     pb.ioParam.ioRefNum = refNum;
  179.     return (PBFlushFileSync(&pb));
  180. }
  181.  
  182. /*****************************************************************************/
  183.  
  184. pascal    OSErr    LockRange(short refNum,
  185.                           long rangeLength,
  186.                           long rangeStart)
  187. {
  188.     ParamBlockRec pb;
  189.  
  190.     pb.ioParam.ioRefNum = refNum;
  191.     pb.ioParam.ioReqCount = rangeLength;
  192.     pb.ioParam.ioPosMode = fsFromStart;
  193.     pb.ioParam.ioPosOffset = rangeStart;
  194.     return (PBLockRangeSync(&pb));
  195. }
  196.  
  197. /*****************************************************************************/
  198.  
  199. pascal    OSErr    UnlockRange(short refNum,
  200.                             long rangeLength,
  201.                             long rangeStart)
  202. {
  203.     ParamBlockRec pb;
  204.  
  205.     pb.ioParam.ioRefNum = refNum;
  206.     pb.ioParam.ioReqCount = rangeLength;
  207.     pb.ioParam.ioPosMode = fsFromStart;
  208.     pb.ioParam.ioPosOffset = rangeStart;
  209.     return (PBUnlockRangeSync(&pb));
  210. }
  211.  
  212. /*****************************************************************************/
  213.  
  214. pascal    OSErr    GetForeignPrivs(short vRefNum,
  215.                                 long dirID,
  216.                                 StringPtr name,
  217.                                 Ptr foreignPrivBuffer,
  218.                                 long *foreignPrivSize,
  219.                                 long *foreignPrivInfo1,
  220.                                 long *foreignPrivInfo2,
  221.                                 long *foreignPrivInfo3,
  222.                                 long *foreignPrivInfo4)
  223. {
  224.     HParamBlockRec pb;
  225.     OSErr error;
  226.  
  227.     pb.foreignPrivParam.ioNamePtr = name;
  228.     pb.foreignPrivParam.ioVRefNum = vRefNum;
  229.     pb.foreignPrivParam.ioForeignPrivDirID = dirID;    
  230.     pb.foreignPrivParam.ioForeignPrivBuffer = foreignPrivBuffer;
  231.     pb.foreignPrivParam.ioForeignPrivReqCount = *foreignPrivSize;
  232.     error = PBGetForeignPrivsSync(&pb);
  233.     *foreignPrivSize = pb.foreignPrivParam.ioForeignPrivActCount;
  234.     *foreignPrivInfo1 = pb.foreignPrivParam.ioForeignPrivInfo1;
  235.     *foreignPrivInfo2 = pb.foreignPrivParam.ioForeignPrivInfo2;
  236.     *foreignPrivInfo3 = pb.foreignPrivParam.ioForeignPrivInfo3;
  237.     *foreignPrivInfo4 = pb.foreignPrivParam.ioForeignPrivInfo4;
  238.     return (error);
  239. }
  240.  
  241. /*****************************************************************************/
  242.  
  243. pascal    OSErr    FSpGetForeignPrivs(const FSSpec *spec,
  244.                                    Ptr foreignPrivBuffer,
  245.                                    long *foreignPrivSize,
  246.                                    long *foreignPrivInfo1,
  247.                                    long *foreignPrivInfo2,
  248.                                    long *foreignPrivInfo3,
  249.                                    long *foreignPrivInfo4)
  250. {
  251.     return (GetForeignPrivs(spec->vRefNum, spec->parID, (StringPtr)spec->name,
  252.                             foreignPrivBuffer, foreignPrivSize,
  253.                             foreignPrivInfo1, foreignPrivInfo2,
  254.                             foreignPrivInfo3, foreignPrivInfo4));
  255. }
  256.  
  257. /*****************************************************************************/
  258.  
  259. pascal    OSErr    SetForeignPrivs(short vRefNum,
  260.                                 long dirID,
  261.                                 StringPtr name,
  262.                                 Ptr foreignPrivBuffer,
  263.                                 long *foreignPrivSize,
  264.                                 long foreignPrivInfo1,
  265.                                 long foreignPrivInfo2,
  266.                                 long foreignPrivInfo3,
  267.                                 long foreignPrivInfo4)
  268. {
  269.     HParamBlockRec pb;
  270.     OSErr error;
  271.  
  272.     pb.foreignPrivParam.ioNamePtr = name;
  273.     pb.foreignPrivParam.ioVRefNum = vRefNum;
  274.     pb.foreignPrivParam.ioForeignPrivDirID = dirID;    
  275.     pb.foreignPrivParam.ioForeignPrivBuffer = foreignPrivBuffer;
  276.     pb.foreignPrivParam.ioForeignPrivReqCount = *foreignPrivSize;
  277.     pb.foreignPrivParam.ioForeignPrivInfo1 = foreignPrivInfo1;
  278.     pb.foreignPrivParam.ioForeignPrivInfo2 = foreignPrivInfo2;
  279.     pb.foreignPrivParam.ioForeignPrivInfo3 = foreignPrivInfo3;
  280.     pb.foreignPrivParam.ioForeignPrivInfo4 = foreignPrivInfo4;
  281.     error = PBSetForeignPrivsSync(&pb);
  282.     *foreignPrivSize = pb.foreignPrivParam.ioForeignPrivActCount;
  283.     return (error);
  284. }
  285.  
  286. /*****************************************************************************/
  287.  
  288. pascal    OSErr    FSpSetForeignPrivs(const FSSpec *spec,
  289.                                    Ptr foreignPrivBuffer,
  290.                                    long *foreignPrivSize,
  291.                                    long foreignPrivInfo1,
  292.                                    long foreignPrivInfo2,
  293.                                    long foreignPrivInfo3,
  294.                                    long foreignPrivInfo4)
  295. {
  296.     return (SetForeignPrivs(spec->vRefNum, spec->parID, (StringPtr)spec->name,
  297.                             foreignPrivBuffer, foreignPrivSize,
  298.                             foreignPrivInfo1, foreignPrivInfo2,
  299.                             foreignPrivInfo3, foreignPrivInfo4));
  300. }
  301.  
  302. /*****************************************************************************/
  303.  
  304. pascal    OSErr    HGetLogInInfo(StringPtr volName,
  305.                               short vRefNum,
  306.                               short *loginMethod,
  307.                               StringPtr userName)
  308. {
  309.     HParamBlockRec pb;
  310.     OSErr error;
  311.  
  312.     pb.objParam.ioNamePtr = volName;
  313.     pb.objParam.ioVRefNum = vRefNum;
  314.     pb.objParam.ioObjNamePtr = userName;
  315.     error = PBHGetLogInInfoSync(&pb);
  316.     *loginMethod = pb.objParam.ioObjType;
  317.     return (error);
  318. }
  319.  
  320. /*****************************************************************************/
  321.  
  322. pascal    OSErr    HGetDirAccess(short vRefNum,
  323.                               long dirID,
  324.                               StringPtr name,
  325.                               long *ownerID,
  326.                               long *groupID,
  327.                               long *accessRights)
  328. {
  329.     HParamBlockRec pb;
  330.     OSErr error;
  331.  
  332.     pb.accessParam.ioNamePtr = name;
  333.     pb.accessParam.ioVRefNum = vRefNum;
  334.     pb.fileParam.ioDirID = dirID;
  335.     error = PBHGetDirAccessSync(&pb);
  336.     *ownerID = pb.accessParam.ioACOwnerID;
  337.     *groupID = pb.accessParam.ioACGroupID;
  338.     *accessRights = pb.accessParam.ioACAccess;
  339.     return (error);
  340. }
  341.  
  342. /*****************************************************************************/
  343.  
  344. pascal    OSErr    FSpGetDirAccess(const FSSpec *spec,
  345.                                 long *ownerID,
  346.                                 long *groupID,
  347.                                 long *accessRights)
  348. {
  349.     return (HGetDirAccess(spec->vRefNum, spec->parID, (StringPtr)spec->name,
  350.                           ownerID, groupID, accessRights));
  351. }
  352.  
  353. /*****************************************************************************/
  354.  
  355. pascal    OSErr    HSetDirAccess(short vRefNum,
  356.                               long dirID,
  357.                               StringPtr name,
  358.                               long ownerID,
  359.                               long groupID,
  360.                               long accessRights)
  361. {
  362.     HParamBlockRec pb;
  363.  
  364.     pb.accessParam.ioNamePtr = name;
  365.     pb.accessParam.ioVRefNum = vRefNum;
  366.     pb.fileParam.ioDirID = dirID;
  367.     pb.accessParam.ioACOwnerID = ownerID;
  368.     pb.accessParam.ioACGroupID = groupID;
  369.     pb.accessParam.ioACAccess = accessRights;
  370.     return (PBHSetDirAccessSync(&pb));
  371. }
  372.  
  373. /*****************************************************************************/
  374.  
  375. pascal    OSErr    FSpSetDirAccess(const FSSpec *spec,
  376.                                 long ownerID,
  377.                                 long groupID,
  378.                                 long accessRights)
  379. {
  380.     return (HSetDirAccess(spec->vRefNum, spec->parID, (StringPtr)spec->name,
  381.                           ownerID, groupID, accessRights));
  382. }
  383.  
  384. /*****************************************************************************/
  385.  
  386. pascal    OSErr    HMapID(StringPtr volName,
  387.                        short vRefNum,
  388.                        long ID,
  389.                        short objType,
  390.                        StringPtr name)
  391. {
  392.     HParamBlockRec pb;
  393.  
  394.     pb.objParam.ioNamePtr = volName;
  395.     pb.objParam.ioVRefNum = vRefNum;
  396.     pb.objParam.ioObjType = objType;
  397.     pb.objParam.ioObjNamePtr = name;
  398.     pb.objParam.ioObjID = ID;
  399.     return (PBHMapIDSync(&pb));
  400. }
  401.  
  402. /*****************************************************************************/
  403.  
  404. pascal    OSErr    HMapName(StringPtr volName,
  405.                          short vRefNum,
  406.                          const Str255 name,
  407.                          short objType,
  408.                          long *ID)
  409. {
  410.     HParamBlockRec pb;
  411.     OSErr error;
  412.  
  413.     pb.objParam.ioNamePtr = volName;
  414.     pb.objParam.ioVRefNum = vRefNum;
  415.     pb.objParam.ioObjType = objType;
  416.     pb.objParam.ioObjNamePtr = (StringPtr)name;
  417.     error = PBHMapNameSync(&pb);
  418.     *ID = pb.objParam.ioObjID;
  419.     return (error);
  420. }
  421.  
  422. /*****************************************************************************/
  423.  
  424. pascal    OSErr    HCopyFile(short srcVRefNum,
  425.                           long srcDirID,
  426.                           const Str255 srcName,
  427.                           short dstVRefNum,
  428.                           long dstDirID,
  429.                           StringPtr dstPathname,
  430.                           StringPtr copyName)
  431. {
  432.     HParamBlockRec pb;
  433.  
  434.     pb.copyParam.ioVRefNum = srcVRefNum;
  435.     pb.copyParam.ioDirID = srcDirID;
  436.     pb.copyParam.ioNamePtr = (StringPtr)srcName;
  437.     pb.copyParam.ioDstVRefNum = dstVRefNum;
  438.     pb.copyParam.ioNewDirID = dstDirID;
  439.     pb.copyParam.ioNewName = dstPathname;
  440.     pb.copyParam.ioCopyName = copyName;
  441.     return (PBHCopyFileSync(&pb));
  442. }
  443.  
  444. /*****************************************************************************/
  445.  
  446. pascal    OSErr    FSpCopyFile(const FSSpec *srcSpec,
  447.                             const FSSpec *dstSpec,
  448.                             StringPtr copyName)
  449. {
  450.     return (HCopyFile(srcSpec->vRefNum, srcSpec->parID, srcSpec->name,
  451.                       dstSpec->vRefNum, dstSpec->parID, (StringPtr)dstSpec->name, copyName));
  452. }
  453.  
  454. /*****************************************************************************/
  455.  
  456. pascal    OSErr    HMoveRename(short vRefNum,
  457.                             long srcDirID,
  458.                             const Str255 srcName,
  459.                             long dstDirID,
  460.                             StringPtr dstpathName,
  461.                             StringPtr copyName)
  462. {
  463.     HParamBlockRec pb;
  464.  
  465.     pb.copyParam.ioVRefNum = vRefNum;
  466.     pb.copyParam.ioDirID = srcDirID;
  467.     pb.copyParam.ioNamePtr = (StringPtr)srcName;
  468.     pb.copyParam.ioNewDirID = dstDirID;
  469.     pb.copyParam.ioNewName = dstpathName;
  470.     pb.copyParam.ioCopyName = copyName;
  471.     return (PBHMoveRenameSync(&pb));
  472. }
  473.  
  474. /*****************************************************************************/
  475.  
  476. pascal    OSErr    FSpMoveRename(const FSSpec *srcSpec,
  477.                               const FSSpec *dstSpec,
  478.                               StringPtr copyName)
  479. {
  480.     /* make sure the FSSpecs refer to the same volume */
  481.     if (srcSpec->vRefNum != dstSpec->vRefNum)
  482.         return (diffVolErr);
  483.     return (HMoveRename(srcSpec->vRefNum, srcSpec->parID, srcSpec->name, 
  484.                         dstSpec->parID, (StringPtr)dstSpec->name, copyName));
  485. }
  486.  
  487. /*****************************************************************************/
  488.  
  489. pascal    OSErr    GetVolMountInfoSize(StringPtr volName,
  490.                                     short vRefNum,
  491.                                     short *size)
  492. {
  493.     ParamBlockRec pb;
  494.  
  495.     pb.ioParam.ioNamePtr = volName;
  496.     pb.ioParam.ioVRefNum = vRefNum;
  497.     pb.ioParam.ioBuffer = (Ptr)size;
  498.     return (PBGetVolMountInfoSize(&pb));
  499. }
  500.  
  501. /*****************************************************************************/
  502.  
  503. pascal    OSErr    GetVolMountInfo(StringPtr volName,
  504.                                 short vRefNum,
  505.                                 Ptr volMountInfo)
  506. {
  507.     ParamBlockRec pb;
  508.  
  509.     pb.ioParam.ioNamePtr = volName;
  510.     pb.ioParam.ioVRefNum = vRefNum;
  511.     pb.ioParam.ioBuffer = volMountInfo;
  512.     return (PBGetVolMountInfo(&pb));
  513. }
  514.  
  515. /*****************************************************************************/
  516.  
  517. pascal    OSErr    VolumeMount(Ptr volMountInfo,
  518.                             short *vRefNum)
  519. {
  520.     ParamBlockRec pb;
  521.     OSErr error;
  522.  
  523.     pb.ioParam.ioBuffer = volMountInfo;
  524.     error = PBVolumeMount(&pb);
  525.     *vRefNum = pb.ioParam.ioVRefNum;
  526.     return (error);
  527. }
  528.  
  529. /*****************************************************************************/
  530.  
  531. pascal    OSErr    Share(short vRefNum,
  532.                       long dirID,
  533.                       StringPtr name)
  534. {
  535.     HParamBlockRec pb;
  536.  
  537.     pb.fileParam.ioNamePtr = name;
  538.     pb.fileParam.ioVRefNum = vRefNum;
  539.     pb.fileParam.ioDirID = dirID;
  540.     /* Files.h in the universal interfaces, PBShareSync takes a CMovePBPtr */
  541.     /* as the parameter. Inside Macintosh and the original glue used HParmBlkPtr. */
  542.     /* A CMovePBPtr works OK, but this will be changed in the future  back to */
  543.     /* HParmBlkPtr, so I'm just casting it here. */
  544.     return (PBShareSync((CMovePBPtr)&pb));
  545. }
  546.  
  547. /*****************************************************************************/
  548.  
  549. pascal    OSErr    FSpShare(const FSSpec *spec)
  550. {
  551.     return (Share(spec->vRefNum, spec->parID, (StringPtr)spec->name));
  552. }
  553.  
  554. /*****************************************************************************/
  555.  
  556. pascal    OSErr    Unshare(short vRefNum,
  557.                         long dirID,
  558.                         StringPtr name)
  559. {
  560.     HParamBlockRec pb;
  561.  
  562.     pb.fileParam.ioNamePtr = name;
  563.     pb.fileParam.ioVRefNum = vRefNum;
  564.     pb.fileParam.ioDirID = dirID;
  565.     /* Files.h in the universal interfaces, PBUnshareSync takes a CMovePBPtr */
  566.     /* as the parameter. Inside Macintosh and the original glue used HParmBlkPtr. */
  567.     /* A CMovePBPtr works OK, but this will be changed in the future  back to */
  568.     /* HParmBlkPtr, so I'm just casting it here. */
  569.     return (PBUnshareSync((CMovePBPtr)&pb));
  570. }
  571.  
  572. /*****************************************************************************/
  573.  
  574. pascal    OSErr    FSpUnshare(const FSSpec *spec)
  575. {
  576.     return (Unshare(spec->vRefNum, spec->parID, (StringPtr)spec->name));
  577. }
  578.  
  579. /*****************************************************************************/
  580.  
  581. pascal    OSErr    GetUGEntry(short objType,
  582.                            StringPtr objName,
  583.                            long *objID)
  584. {
  585.     HParamBlockRec pb;
  586.     OSErr error;
  587.  
  588.     pb.objParam.ioObjType = objType;
  589.     pb.objParam.ioObjNamePtr = objName;
  590.     pb.objParam.ioObjID = *objID;
  591.     /* Files.h in the universal interfaces, PBGetUGEntrySync takes a CMovePBPtr */
  592.     /* as the parameter. Inside Macintosh and the original glue used HParmBlkPtr. */
  593.     /* A CMovePBPtr works OK, but this will be changed in the future  back to */
  594.     /* HParmBlkPtr, so I'm just casting it here. */
  595.     error = PBGetUGEntrySync((CMovePBPtr)&pb);
  596.     *objID = pb.objParam.ioObjID;
  597.     return (error);
  598. }
  599.  
  600. /*****************************************************************************/
  601.